package com.ljc.ssm.handler;

import com.ljc.ssm.common.BizException;
import com.ljc.ssm.common.ExceptionCode;
import com.ljc.ssm.common.JsonResult;
import com.ljc.ssm.utils.ResponseUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * ControllerAdvice
 * 全局异常处理器: 作为针对所有的控制器的切面
 * 能够集中处理异常
 * ControllerAdvice表示对所有的控制器中的所有方法
 * 不需要单独指定切点,
 * 而需要的是通过ExceptionHandler指定要处理的异常类型
 *
 * ControllerAdvice+ResponseBody = RestControllerAdvice
 * @author bill
 */

/*@ControllerAdvice
@ResponseBody*/

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 针对业务中出现的异常(自定义异常类型)
     * @param e
     * @return
     */
    @ExceptionHandler(value = BizException.class)
    public JsonResult handleBizException(BizException e){
        System.out.println(e);
        ExceptionCode exceptionCode = e.getExceptionCode();
        return  ResponseUtil.failed(exceptionCode.getCode(),exceptionCode.getMessage());
    }



    /**
     * 处理所有问题(异常和错误)的方法
     * @param throwable springmvc自动把出现的异常对象注入在参数中
     * @return 给前端的响应结果
     */
    @ExceptionHandler(value = Throwable.class)
    public JsonResult handleException(Throwable throwable){
        System.out.println(throwable);
       // throwable.printStackTrace();


        //1 把异常记录到文件中(系统异常日志)
        // 采用日志框架,向指定的文件中记录异常信息
            /*log.info("--------------------------------");
            StackTraceElement[] stackTrace = throwable.getStackTrace();
            for (StackTraceElement stackTraceElement : stackTrace) {
                //log.error(stackTraceElement.toString())
            }
            log.info("--------------------------------");*/

        // 2. 给前端打哈哈 服务器开小差了, 请稍后再试
        return  ResponseUtil.failed(50000,"服务器开小差了, 请稍后再试");

    }


}
